package eshop.local.logic;

import java.io.IOException;
import java.util.List;
import java.util.Vector;


import eshop.local.Exceptions.ArtikelExistiertBereitsException;
import eshop.local.Exceptions.UserExistiertBereitsException;
import eshop.local.logic.ArtikelVerwaltung;
import eshop.local.valueobjects.Artikel;
import eshop.local.valueobjects.Basket;
import eshop.local.valueobjects.Kunde;
import eshop.local.valueobjects.Mitarbeiter;
import eshop.local.valueobjects.Rechnung;
import eshop.local.valueobjects.Transfer;
import eshop.local.valueobjects.User;


public class ShopVerwaltung {		

	public ArtikelVerwaltung artVerw;
	public KundenVerwaltung userVerw;
	public MitarbeiterVerwaltung mitVerw;
	
	

	public ShopVerwaltung() throws IOException, ClassNotFoundException {
		
		artVerw = new ArtikelVerwaltung();
		artVerw.leseArtikelBestand("ShopSave_A");
		artVerw.leseTransferBestand("ShopSave_T");
		artVerw.leseRechnung("ShopSave_R");
		userVerw = new KundenVerwaltung();
		userVerw.leseUserBestand("ShopSave_K");
		mitVerw = new MitarbeiterVerwaltung();
		mitVerw.leseMitarbeiterBestand("ShopSave_M");
		
		
		}
	
	
	public List<Object> suche(String eing) {
		
		 List<Object> ergebniss = new Vector<Object>();
		
		 List<Artikel> aErg = artVerw.suche(eing);
		 List<Kunde> uErg = userVerw.suche(eing);
		 List<Mitarbeiter> mErg = mitVerw.suche(eing);
		 
		 ergebniss.add(aErg);
		 ergebniss.add(uErg);
		 ergebniss.add(mErg);

		 return ergebniss;
		
	}
		
	/*
	 * ** Aktionen mit Artikeln **
	 * -Ausgabe der Artikelliste
	 * -suchen
	 * -Artikel anhand der Nummer ausgeben
	 * -hinzufuegen
	 * -Artikelnummer Vergabe
	 * -Artikel bearbeiten
	 * -Artikel speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Artikelliste	
	 * @return
	 */
	public List<Artikel> gibAlleArtikel() {
		return artVerw.gebeArtikelBestand();
	}
	
	/**
	 * Artikel suchen
	 * @return
	 */
	public List<Artikel> sucheNachArtikel(String eing) {
		return artVerw.suche(eing);
	}
	/**
	 * Artikel anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 */
	public Artikel gibArtikelMitNummer(int nummer) {
		return artVerw.artikelMitNummerGeben(nummer);
	}
	
	/**
	 * Artikel hinzufuegen
	 * @param a
	 */
	public void artikelHinzufuegen(Artikel a) {
			try { 
				artVerw.hinzufuegen(a);
				} catch (ArtikelExistiertBereitsException e){}
	}
	/**
	 * Artikelnummernvergabe
	 * @return
	 */
	public int vergebeArtikelNummer() {
		return artVerw.artikelNummerVergabe();
	}
	
	/**
	 * Artikel bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteArtikel(int n, String p, String v, int u) {
		artVerw.artikelbearbeiten(n, p, v, u);
	}
	
	/**
	 * Artikel speichern
	 * @param dateiA
	 * @throws IOException
	 */
	public void artikelSpeichern(String dateiA) throws IOException {
		artVerw.schreibeArtikelBestand(dateiA);
	}
	
	
	/*
	 * ** Aktionen mit Kunde **
	 * -Ausgabe der Kundenliste
	 * -suchen
	 * -Kunde anhand der Nummer ausgeben
	 * -Kunde hinzufuegen
	 * -Kundennummer Vergabe
	 * -Kunde bearbeiten
	 * -Kunde entfernen
	 * -Kunde speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Kundenliste	
	 * @return
	 */
	public List<Kunde> gibAlleKunden() {
		return userVerw.gebeKundenBestand();
	}
	
	/**
	 * suche nach Kunde
	 * @param n
	 * @param p
	 */
	public List<Kunde>sucheNachKunde(String n) {
		return userVerw.suche(n);
	}
	/**
	 * Kunde anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 */
	public User gibKundeMitNummer(int nummer) {
		return userVerw.userMitNummerGeben(nummer);
	}
	/**
	 * Kunde hinzufuegen
	 * @param u
	 */
	public boolean kundenHinzufuegen(Kunde k) { 
		try {
			userVerw.hinzufuegen(k);
		} catch (UserExistiertBereitsException e){
			return false;
		}
		return true;
	}
		
	/**
	 * Kundennummern Vergabe
	 * @return
	 */
	public int vergebeKundenNummer() {
		return userVerw.kundenNummerVergabe(); 
	}

	/**
	 * Kunde bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteKunde(String n, String p, String v) {
		userVerw.kundeBearbeiten(n, p, v);
	}
	
	/**
	 * Kunde entfernen
	 * @param a
	 */
	public void kundenEntfernen(Kunde k) {
		userVerw.entfernen(k);
	}
	
	/**
	 * Kunde abspeichern
	 * @param dateiU
	 * @throws IOException
	 */
	public void kundeSpeichern(String dateiU) throws IOException {
		userVerw.schreibeKundenBestand(dateiU);
	}
	
	
	
	
	/*
	 * ** Aktionen mit Mitarbeiter **
	 * -Ausgabe der Mitarbeiterliste
	 * -suchen
	 * -Mitarbeiter anhand der Nummer ausgeben
	 * -hinzufuegen
	 * -Mitarbeiternummer Vergabe
	 * -Mitarbeiter bearbeiten
	 * -Mitarbeiter entfernen
	 * -Mitarbeiter speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Mitarbeiterliste	
	 * @return
	 */
	public List<Mitarbeiter> gibAlleMitabeiter() {
		return mitVerw.gebeMitarbeiterBestand();
	}
	
	/**
	 * suche nach Mitarbeiter
	 * @param n
	 * @param p
	 */
	public List<Mitarbeiter>sucheNachMitarbeiter(String n) {
		return mitVerw.suche(n);
	}
	/**
	 * Mitarbeiter anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 */
	public Mitarbeiter gibMitarbeiterMitNummer(int n) {
		return mitVerw.mitarbeiterMitNummerGeben(n);
	}
	/**
	 * Mitarbeiter hinzufuegen
	 * @param u
	 */
	public boolean mitarbeiterhinzufuegen(Mitarbeiter m) {
		try {
			mitVerw.hinzufuegen(m);
		} catch (UserExistiertBereitsException e){
			return false;
		}
		return true;
	}
		
	/**
	 * Mitarbeiterummern Vergabe
	 * @return
	 */
	public int vergebeMitarbeiterNummer() {
		return mitVerw.mitarbeiterNummerVergabe();
	}

	/**
	 * Mitarbeiter bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteMitarbeiter(String n, String p, String v) {
		mitVerw.mitarbeiterBearbeiten(n, p, v);
	}
	
	/**
	 * Mitarbeiter entfernen
	 * @param a
	 */
	public void mitarbeiterentfernen(Mitarbeiter m) {
		mitVerw.entfernen(m);
	}
	
	/**
	 * Mitarbeiter abspeichern
	 * @param dateiU
	 * @throws IOException
	 */
	public void mitarbeiterSpeichern(String dateiM) throws IOException {
		mitVerw.schreibeMitarbeiterBestand(dateiM);
	}
	
	public void gebeWarenkorbAb(Basket b){
		artVerw.warenkorbAbgeben(b);
	}
	
	public void tranferSpeichern(String dateiT) throws IOException {
		artVerw.schreibeTransferBestand(dateiT);
	}
	
	public void rechnungenSpeichern(String dateiR) throws IOException {
		artVerw.schreibeRechnungsBestand(dateiR);
	}
	
	public List<Transfer> gibAlleTransfer () {
		return artVerw.getTransferListe();
	}
	
	/**
	 * Rechnung anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 */
	public Rechnung gibRechnungMitNummer(int nummer) {
		return artVerw.getRechnung(nummer);
	}
	
	
	
	// *** Alles speichern ***
	/**
	 * Kunden & Artikel zusammen speichern
	 * @param dateiU
	 * @param dateiA
	 * @throws IOException
	 */
	public void allesSpeichern(String k,String m, String a, String t,String r)throws IOException {
		mitVerw.schreibeMitarbeiterBestand(m);
		userVerw.schreibeKundenBestand(k);
		artVerw.schreibeArtikelBestand(a);
		artVerw.schreibeTransferBestand(t);	
		artVerw.schreibeRechnungsBestand(r);	
	}
	
	
}